---
title: 'docker'
date: '2023-08-01'
lastmod: '2023-10-03'
tags: ['docker']
# draft: false
summary: '认识docker是什么，带来了什么便利以及功能'
# images: ['/static/images/twitter-card.png']
---


<br/>

**目录**
- [Docker是什么](#一-docker是什么)
- [docker与虚拟机的区别](#二-docker与虚拟机的区别)
- [docker特性](#三、docker特性)
- [docker的三个基本概念](#四docker的三个基本概念)
- [docker架构](#五docker架构)
- [docker核心组件](#docker核心组件)
- [docker网络](#docker网络)

#### 一 、Docker是什么

Docker是一个**开源的应用容器引擎**，让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中，然后发布到任何流行的Linux机器上，也可以实现虚拟化。容器完全使用沙盒机制，相互之间不会存在任何接口。几乎没有性能开销，可以很容易的在机器和数据中心运行。最重要的是，他们不依赖于任何语言、框架或者包装系统



#### 二 、Docker与虚拟机的区别

| 特性    | dockre                           | 虚拟机    |
| ----- | -------------------------------- | ------ |
| 启动    | 秒级                               | 分钟级    |
| 硬盘使用  | 一般为M                             | 一般为GB  |
| 性能    | 接近原生                             | 弱于     |
| 系统支持量 | 单机支持上千个容器                        | 一般是几十个 |
| 隔离性   | 容器间可互相读取操作                       | 完全隔离   |
| 系统    | 跟随机器 | 自定义安装  |

**Docker 的优势**

- Docker 启动快速属于秒级别

- Docker 需要的资源更少

- Docker 更轻量

- 与虚拟机相比，Docker 隔离性更弱。Docker 属于进程之间的隔离，虚拟机可实现系统级别隔离。

- 安全性。Docker 的安全性也更弱，Docker 的租户 Root 和宿主机 Root 等同，一旦容器内的用户从普通用户权限提升为 Root 权限，它就直接具备了宿主机的 Root 权限，进而可进行无限制的操作。

- 高可用和可恢复性。

- 快速创建、删除

- 交付、部署
  
  

**Docker局限性**

Docker用于应用程序时是最有用的，但并不包含数据。日志、数据库等通常放在Docker容器外。一个容器的镜像通常都很小，不用和存储大量数据，存储可以通过外部挂载等方式使用，比如：NFS、ipsan、MFS等 ，或者docker命令 ，-v映射磁盘分区。总之，docker只用于计算，存储交给别人。





#### 三、Docker特性  [⬆ 回顶部](#)

* 文件系统隔离：每个进程容器运行在一个完全独立的根文件系统里。
* 资源隔离：系统资源，像CPU和内存等可以分配到不同的容器中，使用cgroup。
* 网络隔离：每个进程容器运行在自己的网路空间，虚拟接口和IP地址。
* 日志记录：Docker将收集到和记录的每个进程容器的标准流（stdout/stderr/stdin），用于实时检索或者批量检索
* 变更管理：容器文件系统的变更可以提交到新的镜像中，并可重复使用以创建更多的容器。无需使用模板或者手动配置。
* 交互式shell：Docker可以分配一个虚拟终端并且关联到任何容器的标准输出上，例如运行一个一次性交互shell。
  
  
  
  

#### 四、Docker的三个基本概念   [⬆ 回顶部](#)

- Image（镜像）
  
  - Docker 镜像可以看作是一个特殊的文件系统，除了提供容器运行时所需的程序、库、资源、配置等文件外，还包含了一些为运行时准备的一些配置参数（如匿名卷、环境变量、用户等）。
    镜像不包含任何动态数据，其内容在构建之后也不会被改变。镜像（Image）就是一堆只读层（read-only layer）的统一视角

- Container（容器）
  
  - 容器（Container）的定义和镜像（Image）几乎一模一样，也是一堆层的统一视角，唯一区别在于容器的最上面那一层是可读可写的。
  
  - 由于容器的定义并没有提及是否要运行容器，所以实际上，容器 = 镜像 + 读写层。

- Repository（仓库）
  
  - Docker 仓库是集中存放镜像文件的场所。镜像构建完成后，可以很容易的在当前宿主上运行。
  
  - 仓库又可以分为两种形式：
    
    - Public（公有仓库）
    
    - Private（私有仓库）

<br/>

#### 五、Docker架构    [⬆ 回顶部](#)

Docker运行的基本流程为：
- 1、用户是使用Docker Client与Docker Daemon建立通信，并发送请求给后者。
- 2、 Docker Daemon作为Docker架构中的主体部分，首先提供Docker Server的功能使其可以接受Docker Client的请求。
- 3、 Docker Engine执行Docker内部的一系列工作，每一项工作都是以一个Job的形式的存在。
- 4、Job的运行过程中，当需要容器镜像时，则从Docker Registry中下载镜像，并通过镜像管理驱动Graph driver将下载镜像以Graphi的形式存储。
- 5、当需要为Docker创建网铬环境时，通过网铬管理驱动Network driver创建并配置Docker容器网铬环境。
- 6、当需要限制Docker容器运行资源或执行用户指令等操作时，则通过Exec driver来完成。
- 7 、Libcontainer是一项独立的容器管理包，Network driverl以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作。



#### Docker核心组件

- Docker Client
  
  - Docker Client ，也称 Docker 客户端。它其实就是 Docker 提供命令行界面（CLI）工具，是许多 Docker 用户与 Docker 进行交互的主要方式。

- Docker Daemon
  
  - Docker Daemon 是服务器组件，以 Linux 后台服务的方式运行，是 Docker 最核心的后台进程，我们也把它称为守护进程。

-  Docker Image
  
  - Docker 镜像可以看作是一个特殊的文件系统，除了提供容器运行时所需的程序、库、资源、配置等文件外，还包含了一些为运行时准备的一些配置参数（如匿名卷、环境变量、用户等）。

-  Docker Container
  
  - Docker 容器就是 Docker 镜像的运行实例，是真正运行项目程序、消耗系统资源、提供服务的地方。

-  Docker Registry
  
  - Docker Registry 是存储 Docker Image 的仓库


#### Docker网络

- 本地网络
```shell
# 关于docker0呢，其实就是一个叫docker0的虚拟网桥。我们使用brctl命令来查看一下。（没有这个命令的下载yum -y install bridge-utils）
brctl show
```
veth-pair技术：我们每启动一个docker容器，docker就会给docker容器分配一个ip，安装docker之后，会产生一个叫docker0的网卡，这里使用的就是**veth-pair技术**。    
veth-pair 就是一堆的虚拟设备接口，他们都是成对出现的，一端连接着协议，一端连接着彼此。使得它充当了一个桥梁的作用。

![veth-pair桥接](/static/images/dcoker/20250113134015.png)

- docker网络模式有以下几种：
   
```shell
Host：容器不会虚拟出自己的网卡，配置主机的IP等,而是使用宿主机的IP和端口

Container: 创建的容器不会创建自己的网卡，配置自己的IP，而是和一个指定的容器共享IP。（一般不用）

None: 该模式关闭了容器的网络功能。（一般不用）

Bridge：默认为该模式（桥接，自己创建也是用它），此模式会为每一个容器分配，设置IP等，并将容器连接到一个docker0 的虚拟网桥，通过docker 0 网桥以及iptables nat 表配置与宿主机通信。
docker network ls   
#列出docker网卡
```
